Circuit Breaker Pattern এবং Resilience4j Integration

Java Technologies - স্প্রিং বুট ক্লায়েন্ট (Spring Boot Client)
76
76

Circuit Breaker প্যাটার্ন মূলত মাইক্রোসার্ভিস আর্কিটেকচারে ব্যবহৃত হয়, যেখানে ব্যর্থ API কলগুলোকে হ্যান্ডল করে সার্ভিসের স্থিতিশীলতা নিশ্চিত করা হয়। Resilience4j হলো একটি জনপ্রিয় লাইব্রেরি, যা Circuit Breaker সহ অন্যান্য রেজিলিয়েন্স প্যাটার্ন সাপোর্ট করে।


১. Resilience4j ডিপেন্ডেন্সি যোগ করা

pom.xml (Maven):

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot3</artifactId>
    <version>2.0.2</version> <!-- সর্বশেষ ভার্সন চেক করুন -->
</dependency>

build.gradle (Gradle):

implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.0.2'

২. Circuit Breaker কনফিগারেশন

application.yml ফাইলে Circuit Breaker সেটআপ:

resilience4j:
  circuitbreaker:
    configs:
      default:
        slidingWindowSize: 10
        failureRateThreshold: 50
        waitDurationInOpenState: 5s
    instances:
      myService:
        baseConfig: default
        slidingWindowSize: 5
        waitDurationInOpenState: 10s

৩. Circuit Breaker ব্যবহার করা

@CircuitBreaker অ্যানোটেশন ব্যবহার:

Resilience4j সরাসরি @CircuitBreaker অ্যানোটেশন দিয়ে ব্যবহার করা যায়।

উদাহরণ:

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class ApiService {
    private final RestTemplate restTemplate;

    public ApiService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @CircuitBreaker(name = "myService", fallbackMethod = "fallbackMethod")
    public String fetchData(String url) {
        return restTemplate.getForObject(url, String.class);
    }

    // Fallback method
    public String fallbackMethod(String url, Throwable ex) {
        return "Fallback response: Service is temporarily unavailable.";
    }
}

@CircuitBreaker প্যারামিটার ব্যাখ্যা:

  • name: কনফিগার করা সার্ভিসের নাম (যেমন myService).
  • fallbackMethod: একটি বিকল্প মেথড, যা Circuit Breaker খোলা থাকলে কল করা হবে।

৪. Manual Circuit Breaker API ব্যবহার করা

Circuit Breaker প্রোগ্রাম্যাটিকভাবে ব্যবহারের জন্য CircuitBreakerRegistry ব্যবহার করা হয়।

উদাহরণ:

import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import org.springframework.stereotype.Service;

@Service
public class ApiServiceManual {
    private final CircuitBreaker circuitBreaker;

    public ApiServiceManual(CircuitBreakerRegistry circuitBreakerRegistry) {
        // Custom configuration
        CircuitBreakerConfig config = CircuitBreakerConfig.custom()
                .failureRateThreshold(50)
                .slidingWindowSize(10)
                .build();

        this.circuitBreaker = circuitBreakerRegistry.circuitBreaker("myService", config);
    }

    public String fetchDataWithCircuitBreaker(String url) {
        return circuitBreaker.executeSupplier(() -> {
            // API call logic
            RestTemplate restTemplate = new RestTemplate();
            return restTemplate.getForObject(url, String.class);
        });
    }
}

৫. Retry এবং Rate Limiter ইন্টিগ্রেশন

Resilience4j-এ Circuit Breaker ছাড়াও Retry এবং Rate Limiter ব্যবহার করা যায়।

Retry কনফিগারেশন:

resilience4j:
  retry:
    configs:
      default:
        maxAttempts: 3
        waitDuration: 2s
    instances:
      myServiceRetry:
        baseConfig: default

@Retry অ্যানোটেশন ব্যবহার:

import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.stereotype.Service;

@Service
public class ApiServiceWithRetry {

    @Retry(name = "myServiceRetry", fallbackMethod = "fallbackMethod")
    public String fetchData(String url) {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.getForObject(url, String.class);
    }

    public String fallbackMethod(String url, Throwable ex) {
        return "Fallback response: Retry failed.";
    }
}

৬. Circuit Breaker এর জন্য মেট্রিক্স এবং মনিটরিং

Actuator ব্যবহার করে Circuit Breaker এর মেট্রিক্স মনিটর করা যায়।

ডিপেন্ডেন্সি যোগ করা:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.yml এ মেট্রিক্স এনাবল করা:

management:
  endpoints:
    web:
      exposure:
        include: resilience4j.circuitbreakers

মনিটরিং URL:

http://localhost:8080/actuator/resilience4j/circuitbreakers

সারাংশ

  1. Resilience4j সেটআপ: ডিপেন্ডেন্সি ও কনফিগারেশন যোগ করুন।
  2. Circuit Breaker ব্যবহার: @CircuitBreaker অ্যানোটেশন বা প্রোগ্রাম্যাটিক পদ্ধতি।
  3. Fallback Method: ব্যর্থ হলে বিকল্প মেথড কল করা।
  4. Retry এবং Rate Limiter: সার্ভিসে অতিরিক্ত রেজিলিয়েন্স যোগ করুন।
  5. মেট্রিক্স: Actuator ব্যবহার করে সার্ভিস মনিটর করুন।

এই পদ্ধতিগুলো ব্যবহার করে আপনি Circuit Breaker প্যাটার্ন এবং Resilience4j এর মাধ্যমে আপনার স্প্রিং বুট ক্লায়েন্টকে আরও রেজিলিয়েন্ট করতে পারবেন।

Content added By

Circuit Breaker Pattern এর ধারণা এবং প্রয়োজনীয়তা

50
50

Circuit Breaker Pattern একটি ডিজাইন প্যাটার্ন যা মাইক্রোসার্ভিস বা ডিসট্রিবিউটেড সিস্টেমে ব্যবহৃত হয়। এর প্রধান উদ্দেশ্য হলো নির্ভরশীল সিস্টেম বা সার্ভিসে ব্যর্থতার কারণে অ্যাপ্লিকেশনের বাকি অংশে প্রভাব পড়া থেকে রক্ষা করা। এটি এমন একটি প্রক্রিয়া যেখানে সার্ভিসে সমস্যা হলে ঐ সার্ভিসের প্রতি রিকোয়েস্ট সাময়িকভাবে বন্ধ (open) করে রাখা হয় এবং সময়মতো পুনরায় পরীক্ষা (retry) করে দেখা হয়।


Circuit Breaker Pattern এর কাজের মূলনীতি

Circuit Breaker তিনটি স্টেটে কাজ করে:

  1. Closed State:
    সার্ভিসে সব রিকোয়েস্ট স্বাভাবিকভাবে প্রসেস হয়। যদি রিকোয়েস্টের ব্যর্থতার হার একটি নির্দিষ্ট সীমা অতিক্রম করে, সার্কিট "Open" হয়।
  2. Open State:
    রিকোয়েস্ট সরাসরি ব্যর্থ হয় এবং নির্ধারিত সময় পর্যন্ত সার্ভিসে আর কোনো রিকোয়েস্ট পাঠানো হয় না।
  3. Half-Open State:
    একটি নির্ধারিত সময় পর সার্কিট কিছু রিকোয়েস্ট পাঠানোর অনুমতি দেয়। যদি রিকোয়েস্ট সফল হয়, সার্কিট "Closed" অবস্থায় ফিরে আসে; অন্যথায় "Open" অবস্থায় থাকে।

কেন Circuit Breaker প্রয়োজন?

  1. সার্ভিস ব্যর্থতা হ্রাস করা:
    নির্ভরশীল সার্ভিসের ব্যর্থতার কারণে অ্যাপ্লিকেশনকে পুরোপুরি ভেঙে পড়া থেকে রক্ষা করা।
  2. সিস্টেম স্থিতিশীল রাখা:
    সার্ভিসের ওভারলোড এড়ানো এবং ফেইল্ড রিকোয়েস্টের চাপ হ্রাস করা।
  3. রিকভারি সহজ করা:
    সার্ভিস স্বাভাবিক অবস্থায় ফিরে এলে পুনরায় স্বয়ংক্রিয়ভাবে সার্ভিসের সাথে সংযোগ স্থাপন।
  4. Latency হ্রাস:
    বারবার ব্যর্থ রিকোয়েস্টের কারণে দেরি হওয়া থেকে বাঁচানো।

Spring Boot এ Circuit Breaker Pattern ইমপ্লিমেন্ট করা

Spring Boot এ Circuit Breaker ইমপ্লিমেন্ট করতে Resilience4j বা Spring Cloud Circuit Breaker ব্যবহার করা হয়।

১. Maven Dependency:

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

২. Configuration

application.yml এ Circuit Breaker কনফিগার করুন:

resilience4j:
  circuitbreaker:
    configs:
      default:
        slidingWindowSize: 10
        failureRateThreshold: 50
        waitDurationInOpenState: 5000ms
        permittedNumberOfCallsInHalfOpenState: 3
    instances:
      myCircuitBreaker:
        baseConfig: default

৩. Circuit Breaker ব্যবহার করা

API কল সার্ভিস তৈরি করুন:

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class ApiService {

    private final RestTemplate restTemplate = new RestTemplate();

    @CircuitBreaker(name = "myCircuitBreaker", fallbackMethod = "fallbackResponse")
    public String fetchData() {
        String url = "https://api.example.com/data";
        return restTemplate.getForObject(url, String.class);
    }

    // Fallback Method
    public String fallbackResponse(Throwable t) {
        return "Default Response: Service is temporarily unavailable.";
    }
}

৪. Circuit Breaker Monitor করা

Actuator ব্যবহার করে Circuit Breaker এর স্টেট মনিটর করতে পারেন।

Actuator Dependency:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.yml এ Actuator Enable করুন:

management:
  endpoints:
    web:
      exposure:
        include: resilience4j.circuitbreakers

Actuator Endpoint চেক করুন:

GET http://localhost:8080/actuator/resilience4j/circuitbreakers

উদাহরণ রেসপন্স

Success Response:

{
  "data": "Successfully fetched data from the API."
}

Fallback Response:

{
  "data": "Default Response: Service is temporarily unavailable."
}

Circuit Breaker এর Best Practices

  1. Fallback ব্যবহার করুন:
    ব্যর্থ হলে ডিফল্ট বা ক্যাশড রেসপন্স প্রদান করুন।
  2. Timeout কনফিগার করুন:
    সার্ভিসের টাইমআউট সঠিকভাবে নির্ধারণ করুন।
  3. Monitor এবং Log:
    সার্কিটের ওপেন এবং ক্লোজড স্টেট মনিটর করুন এবং ব্যর্থতার কারণ লগ করুন।
  4. Combine with Retry:
    Circuit Breaker এর সাথে Retry Pattern ব্যবহার করুন।

Circuit Breaker এর সুবিধা:

  • সার্ভিস স্থিতিশীল রাখে।
  • মাইক্রোসার্ভিস আর্কিটেকচারে নির্ভরযোগ্যতা বৃদ্ধি করে।
  • ব্যর্থ রিকোয়েস্টের কারণে ওভারলোডিং এড়ায়।

এইভাবে, Circuit Breaker Pattern ইমপ্লিমেন্ট করে আপনি আপনার অ্যাপ্লিকেশনকে আরও স্থিতিশীল এবং নির্ভরযোগ্য করে তুলতে পারবেন।

Content added By

Spring Boot এ Resilience4j Integration

109
109

Resilience4j হল একটি লাইটওয়েট ফ্রেমওয়ার্ক যা স্প্রিং বুট অ্যাপ্লিকেশনে ফল্ট টলারেন্স (fault tolerance) যোগ করার জন্য ব্যবহার করা হয়। এটি মাইক্রোসার্ভিস বা ক্লায়েন্ট-সার্ভার অ্যাপ্লিকেশনে সার্ভিস ব্যর্থতা থেকে রক্ষা করার জন্য কার্যকর। Resilience4j প্রধানত Circuit Breaker, Retry, Rate Limiter, Bulkhead, এবং Time Limiter সমর্থন করে।

নিচে Spring Boot-এ Resilience4j ইন্টিগ্রেশনের একটি উদাহরণ দেখানো হলো:


১. প্রজেক্ট তৈরি করুন

Spring Initializr ব্যবহার করে একটি নতুন স্প্রিং বুট প্রজেক্ট তৈরি করুন। নিচের ডিপেনডেন্সি যুক্ত করুন:

  • Spring Web
  • Resilience4j

২. pom.xml ডিপেনডেন্সি যুক্ত করুন

<dependencies>
    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-spring-boot2</artifactId>
        <version>1.7.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

৩. application.properties কনফিগারেশন

# Circuit Breaker কনফিগারেশন
resilience4j.circuitbreaker.instances.myService.failure-rate-threshold=50
resilience4j.circuitbreaker.instances.myService.slow-call-rate-threshold=50
resilience4j.circuitbreaker.instances.myService.slow-call-duration-threshold=2s
resilience4j.circuitbreaker.instances.myService.minimum-number-of-calls=5
resilience4j.circuitbreaker.instances.myService.sliding-window-size=10
resilience4j.circuitbreaker.instances.myService.sliding-window-type=COUNT_BASED
resilience4j.circuitbreaker.instances.myService.wait-duration-in-open-state=10s

# Retry কনফিগারেশন
resilience4j.retry.instances.myService.max-attempts=3
resilience4j.retry.instances.myService.wait-duration=2s

৪. API ক্লায়েন্ট তৈরি করুন

import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class ApiClient {

    private final RestTemplate restTemplate;

    public ApiClient(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public String fetchData(String url) {
        return restTemplate.getForObject(url, String.class);
    }
}

৫. Resilience4j Circuit Breaker যুক্ত করুন

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.stereotype.Service;

@Service
public class ResilientApiClient {

    private final ApiClient apiClient;

    public ResilientApiClient(ApiClient apiClient) {
        this.apiClient = apiClient;
    }

    @CircuitBreaker(name = "myService", fallbackMethod = "fallbackFetchData")
    @Retry(name = "myService")
    public String fetchDataWithResilience(String url) {
        return apiClient.fetchData(url);
    }

    // ফallback method
    public String fallbackFetchData(String url, Throwable throwable) {
        return "Fallback response due to: " + throwable.getMessage();
    }
}

৬. Controller ক্লাস তৈরি করুন

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ApiController {

    private final ResilientApiClient resilientApiClient;

    public ApiController(ResilientApiClient resilientApiClient) {
        this.resilientApiClient = resilientApiClient;
    }

    @GetMapping("/fetch-data")
    public String fetchData() {
        String url = "https://jsonplaceholder.typicode.com/posts/1"; // উদাহরণ URL
        return resilientApiClient.fetchDataWithResilience(url);
    }
}

৭. Resilience4j এর বৈশিষ্ট্যসমূহ

১. Circuit Breaker:

  • এটি যখন সার্ভিসে বারবার ব্যর্থতা ঘটে তখন সার্ভিসকে সাময়িকভাবে বন্ধ করে দেয়।
  • @CircuitBreaker ব্যবহার করে নির্ধারণ করা হয়।

২. Retry:

  • এটি একটি নির্দিষ্ট সংখ্যক সময় একই রিকোয়েস্ট পুনরায় চেষ্টা করে।
  • @Retry ব্যবহার করা হয়।

৩. Fallback Method:

  • সার্ভিস ব্যর্থ হলে এটি ব্যাকআপ বা ডিফল্ট রেসপন্স সরবরাহ করে।
  • fallbackMethod প্যারামিটার ব্যবহার করা হয়।

৮. লগ আউটপুট উদাহরণ

সফল API কল:

INFO  - CircuitBreaker 'myService' in CLOSED state.
INFO  - API Response: {userId: 1, id: 1, title: "...", body: "..."}

সার্ভিস ব্যর্থ হলে (Fallback):

INFO  - CircuitBreaker 'myService' in OPEN state.
INFO  - Fallback response due to: I/O error on GET request

৯. Spring Boot Actuator (অপশনাল)

Resilience4j Actuator ব্যবহার করলে Circuit Breaker এর মেট্রিক্স দেখতে পারবেন। pom.xml-এ নিচের ডিপেনডেন্সি যোগ করুন:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

এবং application.properties ফাইলে Actuator সক্রিয় করুন:

management.endpoints.web.exposure.include=*

Endpoint:
http://localhost:8080/actuator/circuitbreakers


Resilience4j এর সুবিধা:

  1. Fault Tolerance: সিস্টেমকে ব্যর্থতা থেকে সুরক্ষা প্রদান করে।
  2. Customizable Policies: কনফিগারেশন ফাইলে পলিসি নির্ধারণ করা যায়।
  3. Spring Integration: স্প্রিং বুট অ্যাপ্লিকেশনের সাথে সহজ ইন্টিগ্রেশন।
  4. Actuator Support: সার্ভিসের মেট্রিক্স মনিটরিং।

Resilience4j হল Spring Boot অ্যাপ্লিকেশনে উচ্চমানের রেজিলিয়েন্স ফ্রেমওয়ার্ক। এটি Hystrix এর বিকল্প এবং বর্তমান সময়ে ব্যবহারযোগ্য একটি উন্নত টুল।

Content added By

Circuit Breaker, Retry, Bulkhead এবং TimeLimiter কনফিগার করা

66
66

Resilience4j লাইব্রেরি ব্যবহার করে এই ফিচারগুলো কনফিগার করা যায়।

Resilience4j হলো একটি হালকা ওজনের ফ্রেমওয়ার্ক যা মাইক্রোসার্ভিসের মধ্যে রেসিলিয়েন্স প্যাটার্ন (যেমন: Circuit Breaker, Retry, Bulkhead, এবং TimeLimiter) সহজে প্রয়োগ করতে সাহায্য করে।


১. Maven ডিপেন্ডেন্সি যোগ করা

আপনার pom.xml ফাইলে নিচের ডিপেন্ডেন্সি যুক্ত করুন:

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>1.7.1</version> <!-- আপনার প্রয়োজন অনুযায়ী ভার্সন ব্যবহার করুন -->
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

২. application.yml কনফিগারেশন

Resilience4j এর জন্য প্রয়োজনীয় কনফিগারেশন application.yml ফাইলে যুক্ত করুন:

resilience4j:
  circuitbreaker:
    configs:
      default:
        slidingWindowSize: 10
        failureRateThreshold: 50
        waitDurationInOpenState: 10s
        permittedNumberOfCallsInHalfOpenState: 3
        minimumNumberOfCalls: 5
    instances:
      myService:
        baseConfig: default
        slidingWindowSize: 20
        failureRateThreshold: 30

  retry:
    configs:
      default:
        maxAttempts: 3
        waitDuration: 2s
    instances:
      myService:
        maxAttempts: 5
        waitDuration: 1s

  bulkhead:
    configs:
      default:
        maxConcurrentCalls: 10
        maxWaitDuration: 0
    instances:
      myService:
        maxConcurrentCalls: 5

  timelimiter:
    configs:
      default:
        timeoutDuration: 2s
    instances:
      myService:
        timeoutDuration: 3s

৩. সার্ভিস ক্লাসে Circuit Breaker এবং Retry ইমপ্লিমেন্টেশন

Circuit Breaker যুক্ত করা

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class MyService {

    private final RestTemplate restTemplate;

    public MyService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @CircuitBreaker(name = "myService", fallbackMethod = "fallbackMethod")
    public String callExternalService() {
        return restTemplate.getForObject("http://example.com/api", String.class);
    }

    public String fallbackMethod(Throwable throwable) {
        return "Fallback response: Service is unavailable";
    }
}

Retry যুক্ত করা

import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Retry(name = "myService", fallbackMethod = "fallbackMethod")
    public String callExternalService() {
        // API call logic
        throw new RuntimeException("Simulated exception");
    }

    public String fallbackMethod(Throwable throwable) {
        return "Fallback response: Retry failed";
    }
}

৪. Bulkhead ইমপ্লিমেন্টেশন

Bulkhead প্যাটার্ন ব্যবহার করে নির্দিষ্ট সংখ্যক কনকারেন্ট কল নিয়ন্ত্রণ করা যায়।

import io.github.resilience4j.bulkhead.annotation.Bulkhead;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Bulkhead(name = "myService", fallbackMethod = "fallbackMethod")
    public String callExternalService() {
        // API call logic
        return "External service response";
    }

    public String fallbackMethod(Throwable throwable) {
        return "Fallback response: Too many concurrent requests";
    }
}

৫. TimeLimiter ইমপ্লিমেন্টেশন

TimeLimiter ব্যবহার করে কোনো সার্ভিসের জন্য নির্দিষ্ট সময়সীমা নির্ধারণ করা যায়।

import io.github.resilience4j.timelimiter.annotation.TimeLimiter;
import org.springframework.stereotype.Service;

import java.util.concurrent.CompletableFuture;

@Service
public class MyService {

    @TimeLimiter(name = "myService")
    public CompletableFuture<String> callExternalService() {
        return CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(3000); // Simulate delay
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return "External service response";
        });
    }
}

৬. লগিং এবং মনিটরিং যুক্ত করা

Resilience4j এর মেট্রিক্সগুলো মনিটর করার জন্য Actuator ব্যবহার করুন।

Maven ডিপেন্ডেন্সি:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.yml:

management:
  endpoints:
    web:
      exposure:
        include: resilience4j*

উদাহরণ:

http://localhost:8080/actuator/resilience4j এ মেট্রিক্স দেখতে পারবেন।


৭. টিপস:

  1. Fallback Method: প্রতিটি Circuit Breaker, Retry, Bulkhead, এবং TimeLimiter এর জন্য একটি ফallback মেথড ব্যবহার করুন।
  2. Timeout Management: সার্ভিস টাইমআউট সঠিকভাবে সেট করুন।
  3. Custom Configuration: প্রয়োজন অনুযায়ী কনফিগারেশন অ্যাডজাস্ট করুন।
  4. Logging: লগিং ব্যবহার করে প্রতিটি রিকোয়েস্ট এবং এর ফলাফল মনিটর করুন।
  5. Actuator Integration: সিস্টেমের স্বাস্থ্য এবং রিসোর্স ব্যবহারের রিপোর্ট পেতে Actuator ব্যবহার করুন।

উপসংহার

Circuit Breaker, Retry, Bulkhead, এবং TimeLimiter এর সাহায্যে মাইক্রোসার্ভিস অ্যাপ্লিকেশন আরও নির্ভরযোগ্য এবং স্কেলেবল হয়। Resilience4j ফ্রেমওয়ার্ক ব্যবহার করে স্প্রিং বুট অ্যাপ্লিকেশন সহজেই এই রেসিলিয়েন্স প্যাটার্নগুলো ইমপ্লিমেন্ট করতে পারে।

Content added By

উদাহরণ সহ Circuit Breaker Pattern ব্যবহার

75
75

Circuit Breaker Pattern হল একটি গুরুত্বপূর্ণ ডিজাইন প্যাটার্ন, যা ডিস্ট্রিবিউটেড সিস্টেমে ফেইলিওর হ্যান্ডল করার জন্য ব্যবহৃত হয়। এটি একটি নির্দিষ্ট সময়ের জন্য ব্যর্থ সার্ভিস কলগুলিকে ব্লক করে এবং সার্ভিস রিকভারির সময় পুনরায় চেষ্টা করতে দেয়। Spring Boot-এ Resilience4j একটি জনপ্রিয় লাইব্রেরি যা Circuit Breaker Pattern বাস্তবায়ন করার জন্য ব্যবহৃত হয়।

নিচে একটি উদাহরণসহ Circuit Breaker Pattern Spring Boot ক্লায়েন্টে কিভাবে ব্যবহার করবেন তা দেখানো হলো।


ধাপ ১: Maven Dependency যোগ করুন

Spring Boot-এ Resilience4j ব্যবহার করার জন্য Maven ডিপেনডেন্সি যোগ করুন।

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>1.7.1</version>
</dependency>

ধাপ ২: Application Properties-এ কনফিগারেশন

Circuit Breaker-এর জন্য কনফিগারেশন সেট করুন।

resilience4j.circuitbreaker.instances.myService.register-health-indicator=true
resilience4j.circuitbreaker.instances.myService.sliding-window-size=5
resilience4j.circuitbreaker.instances.myService.failure-rate-threshold=50
resilience4j.circuitbreaker.instances.myService.wait-duration-in-open-state=5000
resilience4j.circuitbreaker.instances.myService.permitted-number-of-calls-in-half-open-state=3

বিবরণ:

  • failure-rate-threshold: ব্যর্থতার হার, যা Circuit Breaker ওপেন করবে। (%)
  • wait-duration-in-open-state: কতক্ষণ ওপেন অবস্থায় থাকবে। (মিলিসেকেন্ড)
  • sliding-window-size: সর্বশেষ কতটি রিকোয়েস্ট পর্যবেক্ষণ করবে।
  • permitted-number-of-calls-in-half-open-state: হাফ-ওপেন অবস্থায় অনুমোদিত কলের সংখ্যা।

ধাপ ৩: সার্ভিস লেয়ারে Circuit Breaker ব্যবহার

Resilience4j এর Circuit Breaker-টি Spring Boot-এর @CircuitBreaker এনোটেশন ব্যবহার করে সহজেই বাস্তবায়ন করা যায়।

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class ApiService {

    private final RestTemplate restTemplate;

    public ApiService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @CircuitBreaker(name = "myService", fallbackMethod = "fallbackForFetchData")
    public String fetchData() {
        String url = "https://api.example.com/data";
        return restTemplate.getForObject(url, String.class);
    }

    // ফেইলিওর হলে এখানে আসবে
    public String fallbackForFetchData(Throwable throwable) {
        return "Fallback response: Service is currently unavailable.";
    }
}

ধাপ ৪: RestTemplate Bean কনফিগার করুন

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

ধাপ ৫: কন্ট্রোলার থেকে সার্ভিস কল করুন

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ApiController {

    private final ApiService apiService;

    public ApiController(ApiService apiService) {
        this.apiService = apiService;
    }

    @GetMapping("/data")
    public String getData() {
        return apiService.fetchData();
    }
}

ব্যাখ্যা

  1. Normal Behavior:
    • সার্ভিস থেকে ডেটা পাওয়া গেলে fetchData() কাজ করবে।
  2. Failure Handling:
    • যদি সার্ভিস ব্যর্থ হয় (ব্যর্থতার হার কনফিগার করা থ্রেশহোল্ড ছাড়িয়ে যায়), তখন সার্কিট ব্রেকার ওপেন হয়ে যাবে।
    • সার্কিট ওপেন হলে fallbackForFetchData() মেথড কল হবে।

Circuit Breaker এর States

  1. Closed: সার্কিট ব্রেকার সক্রিয় নয় এবং সব রিকোয়েস্ট অনুমোদিত।
  2. Open: ব্যর্থতার থ্রেশহোল্ড ছাড়ালে সার্কিট ব্রেকার ওপেন হয়ে যাবে এবং নতুন রিকোয়েস্ট প্রত্যাখ্যান করবে।
  3. Half-Open: নির্দিষ্ট সময় পর সার্কিট ব্রেকার কয়েকটি রিকোয়েস্ট অনুমোদন করবে। যদি রিকোয়েস্ট সফল হয়, সার্কিট ক্লোজ হয়ে যাবে।

উদাহরণ আউটপুট

  1. Success Case:

    {
        "data": "Actual data from API"
    }
    
  2. Fallback Case:

    {
        "data": "Fallback response: Service is currently unavailable."
    }
    

উপসংহার

Circuit Breaker Pattern:

  • সিস্টেমকে ব্যর্থতার প্রভাব থেকে রক্ষা করে।
  • রিকোয়েস্ট রেট সীমিত রাখে।
  • রিকভারি প্রক্রিয়া সহজ করে।

Resilience4j Spring Boot-এর সাথে Circuit Breaker বাস্তবায়নের জন্য সহজ এবং শক্তিশালী সমাধান।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion